package com.young.lib_fragments.fms.interfaces

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import com.young.lib_fragments.anim.DefaultFmTransactionAnim
import com.young.lib_fragments.anim.IFmTransactionAnim
import com.young.lib_fragments.utils.FmTransitionsUtil

/**
 * @author huangzehui
 * @date 2025/1/10 13:01 周五
 * @description fragment 的转场行为（就是跳转等操作）
 */
interface ITransitions {

    /**
     * 开启一个 fragment
     *
     * @param fm 需要添加的 fragment
     * @param args 传递参数
     * @param fmTag fragment 的 tag，可通过 fmManager.findFragmentByTag() 获取到 fragment
     * @param isToBackStack 是否将 fragment 添加到回退栈中
     * @param toBackStackName 在回退栈中的名称，可通过 fmManager.popBackStack 等类似方法，回退指定 fragment
     * @param fmTransactionAnim 转场动画
     */
    fun start(
        fm: Fragment,
        args: Bundle? = null,
        isToBackStack: Boolean = true,
        toBackStackName: String? = null,
        fmTag: String? = null,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim(),
    )


    /**
     * 添加一个 fragment
     *
     * @param fmTransaction Fragment 事务管理器
     * @param fm 需要添加的 fragment
     * @param args 参数
     * @param fmTag fragment 的 tag，可通过 fmManager.findFragmentByTag() 获取到 fragment
     * @param isToBackStack 是否将 fragment 添加到回退栈中
     * @param toBackStackName 在回退栈中的名称，可通过 fmManager.popBackStack 等类似方法，回退指定 fragment
     * @param fmTransactionAnim 转场动画
     *
     */
    fun start(
        fmTransaction: FragmentTransaction,
        fm: Fragment,
        args: Bundle?,
        fmTag: String? = null,
        isToBackStack: Boolean = true,
        toBackStackName: String? = null,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim()
    )

    /**
     * 添加Fragment，同时移除上一个 fragment
     *
     * @param fm 需要添加的 fragment
     * @param args 参数
     * @param lastFm 上一个 Fragment
     * @param fmTag fragment 的 tag，可通过 fmManager.findFragmentByTag() 获取到 fragment
     * @param isToBackStack 是否将 fragment 添加到回退栈中
     * @param toBackStackName 在回退栈中的名称，可通过 fmManager.popBackStack 等类似方法，回退指定 fragment
     * @param fmTransactionAnim 转场动画
     * @param showCompletedTime 展示完成回调的延时时间
     */
    fun startWithPopFm(
        fm: Fragment,
        args: Bundle? = null,
        lastFm: Fragment,
        fmTag: String? = null,
        isToBackStack: Boolean = true,
        toBackStackName: String? = null,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim(),
        showCompletedTime: Long = FmTransitionsUtil.FM_SHOW_COMPLETED_DELAY_TIME
    )

    /**
     * 返回上一个页面
     *
     */
    fun pop()

    /**
     * 返回到根页面
     *
     */
    fun pop2Root()

    /**
     * 回退到 toBackStackName 对应的栈的 fragment
     *
     * @param toBackStackName 回退栈的名称，就是 addToBackStack 时的名称
     * @param isInclude true: fmTag 对应的fragment也回退 false：保留 fmTag 对应的 fragment 不回退
     */
    fun pop2BackStackNameFm(toBackStackName: String, isInclude: Boolean)

    /**
     * 回退到 tag 对应的栈的 fragment
     *
     * @param id 回退栈的id，可以理解为角标，从 0 开始
     * @param isInclude true: id 对应的fragment也回退 false：保留 id 对应的 fragment 不回退
     */
    fun pop2IdFm(id: Int, isInclude: Boolean)


    /**
     * 移除到指定的 Fragment Cls 对应的 Fragment
     *
     * @param fragmentCls Fragment 对应的 cls
     * @param isInclude 是否将 fragmentCls 的fragment也移除，true：是 false保留 fragmentCls 的fragment
     *
     */
    fun pop2TargetFmCls(
        fragmentCls: Class<out Fragment>,
        isInclude: Boolean
    )


    /**
     * 移除 Fragment
     *
     * @param fm 需要删除的 fragment
     */
    fun removeFragment(fm: Fragment?)


    /**
     * 展示 Fragment
     *
     * @param fm 需要展示的 fragment
     * @param args 参数
     * @param fmTag Fragment 的 tag
     * @param fmTransactionAnim 转场动画
     *
     */
    fun show(
        fm: Fragment,
        args: Bundle?,
        fmTag: String? = null,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim()
    )

    /**
     * 隐藏 Fragment
     *
     * @param fm 需要展示的 fragment
     * @param fmTransactionAnim 转场动画
     *
     */
    fun hide(
        fm: Fragment,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim()
    )

    /**
     * 展示 Fragment
     *
     * @param showFm 需要展示的 fragment
     * @param args 参数
     * @param showFmTag Fragment 的 tag
     * @param hideFm 需要隐藏的 Fragment
     * @param fmTransactionAnim 转场动画
     */
    fun showAndHide(
        showFm: Fragment,
        args: Bundle? = null,
        showFmTag: String? = null,
        hideFm: Fragment?,
        fmTransactionAnim: IFmTransactionAnim? = DefaultFmTransactionAnim()
    )

    /**
     * 获取默认的
     */
    fun getDefaultFmTransactionAnim(): IFmTransactionAnim
}